package com.xch.sboot.service.common;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.concurrent.TimeUnit;

/**
 * @author xch
 * 2022/11/16 11:36
 */
@Service
public class RedisDataService {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 默认缓存时间
     */
    private static final int CACHE_TIME = 5;

    /**
     * 对象转为字符串添加到缓存中 默认5分钟有效
     * @param key key
     * @param data 缓存对象
     */
    public <T> void setRedisData(@NotEmpty String key, @NotEmpty T data) {
        setRedisData(key, data, CACHE_TIME, TimeUnit.MINUTES);
    }

    /**
     * 对象转为字符串添加到缓存中  缓存时间默认单位分钟
     * @param key key
     * @param data 缓存对象
     * @param time 缓存时间 默认单位分钟
     */
    public <T> void setRedisData(@NotEmpty String key, @NotEmpty T data, @NotNull Integer time) {
        setRedisData(key, data, time, TimeUnit.MINUTES);
    }

    /**
     * 对象转为字符串添加到缓存中
     * @param key key
     * @param t 缓存对象
     * @param time 缓存时间
     * @param timeUnit 缓存时间单位
     */
    public <T> void setRedisData(@NotEmpty String key, @NotEmpty T t, @NotNull Integer time, @NotNull TimeUnit timeUnit) {
        redisTemplate.opsForValue().set(key, t, time, timeUnit);
    }

    /**
     * 判断key是否在redis
     * @param key key
     * @return true key存在 false key不存在
     */
    public boolean hasKey(@NotEmpty String key) {
        return Boolean.TRUE.equals(redisTemplate.hasKey(key));
    }

    /**
     * 给缓存延续过期时间
     * @param key 缓存key
     * @param time 延期时间（单位分钟）
     */
    public void expire(@NotEmpty String key, int time) {
        redisTemplate.expire(key, time, TimeUnit.MINUTES);
    }

    /**
     * 删除缓存
     * @param key 缓存key
     */
    public void delete(@NotEmpty String key) {
        redisTemplate.delete(key);
    }


    public Object getRedisObject (@NotEmpty String key) {
        if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
            return redisTemplate.opsForValue().get(key);
        }
        return null;
    }

}
